﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Data.SqlClient;
using System.Data;
using EControl.Modelo;

namespace EControl.Controle
{
    class Usuario
    {
        private string strConn = "Data Source=MARIA-PC\\SQLEXPRESS;Initial Catalog=dbestacionamento;Integrated Security=False;User ID=developer;Password=developer;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False";

        public bool validaLogin(string usuario, string senha)
        {
            try
            {
                string mensagem = "Usuário ou senha inválido.";
                string titulo = "Login";

                if (usuario.Length > 100 || usuario.Length == 0)
                {
                    MessageBoxButton botao = MessageBoxButton.OK;
                    MessageBox.Show(mensagem, titulo, botao);
                    return false;
                }

                if (senha.Length > 32 || senha.Length == 0)
                {
                    MessageBoxButton botao = MessageBoxButton.OK;
                    MessageBox.Show(mensagem, titulo, botao);
                    return false;
                }

                return true;
            }
            catch (Exception)
            {
                return false;   
            }
        }

        public User logarUsuario(string usuario, string senha)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select funcionario_id, is_admin from funcionario where is_deleted = 0 and usuario = '" + usuario + "' and senha = '" + senha + "'";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                User resultado = new User();

                if (dr.HasRows) {
                    while (dr.Read())
                    {
                        resultado.Id = dr["funcionario_id"].ToString();
                        resultado.IsAdmin = (bool)dr["is_admin"];
                    }
                }
                else
                {
                    sqlCon.Close();
                    return null;
                }

                sqlCon.Close();

                return resultado;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }

        public List<User> listarTodos()
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select funcionario_id, nome, cpf, usuario from funcionario where is_deleted = 0 and can_delete = 1 order by nome";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                List<User> resultado = new List<User>();
                User novoUsuario;

                while (dr.Read())
                {
                    novoUsuario = new User();

                    novoUsuario.Id = dr["funcionario_id"].ToString();
                    novoUsuario.Nome = dr["nome"].ToString();
                    novoUsuario.Cpf = dr["cpf"].ToString();
                    novoUsuario.Usuario = dr["usuario"].ToString();

                    resultado.Add(novoUsuario);
                }

                sqlCon.Close();

                return resultado;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }

        public bool usuarioExiste(string usuario)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select * from funcionario where usuario = '" + usuario + "'";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                bool existe = dr.HasRows;

                sqlCon.Close();

                return existe;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return true;
            }
        }

        public bool cpfExiste(string cpf)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select * from funcionario where cpf = '" + cpf + "'";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                bool existe = dr.HasRows;

                sqlCon.Close();

                return existe;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return true;
            }
        }

        public List<User> pesquisar(string pesquisa)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select funcionario_id, nome, cpf, usuario, can_delete from funcionario where (is_deleted = 0 and can_delete = 1) and (funcionario_id like '%" + pesquisa + "%' or nome like '%" + pesquisa + "%' or usuario like '%" + pesquisa + "%' or cpf like '%" + pesquisa + "%') order by nome";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                List<User> resultado = new List<User>();
                User novoUsuario;

                while (dr.Read())
                {
                    novoUsuario = new User();

                    novoUsuario.Id = dr["funcionario_id"].ToString();
                    novoUsuario.Nome = dr["nome"].ToString();
                    novoUsuario.Cpf = dr["cpf"].ToString();
                    novoUsuario.Usuario = dr["usuario"].ToString();

                    resultado.Add(novoUsuario);
                }

                sqlCon.Close();

                return resultado;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }

        public bool apagarUsuario(string id)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "delete from funcionario where funcionario_id = " + id;

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                int result = cmd.ExecuteNonQuery();

                sqlCon.Close();

                if (result > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception e)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show(e.ToString(), "Erro", botao);

                return false;
            }
        }

        public User detalhesUsuario(string idUsuario)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select * from funcionario where funcionario_id = " + idUsuario;

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                User resultado = new User();;

                while (dr.Read())
                {
                    resultado.Id = dr["funcionario_id"].ToString();
                    resultado.Nome = dr["nome"].ToString();
                    resultado.Cpf = dr["cpf"].ToString();
                    resultado.Email = dr["email"].ToString();
                    resultado.Usuario = dr["usuario"].ToString();
                    resultado.IsAdmin = (bool)dr["is_admin"];
                    resultado.Senha = dr["senha"].ToString();
                }

                sqlCon.Close();

                return resultado;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }

        public bool novoUsuario(User usuario)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                int admin = 0;
                if (usuario.IsAdmin)
                {
                    admin = 1;
                }
                else
                {
                    admin = 0;
                }

                string query = "insert into funcionario (nome, cpf, email, usuario, senha, is_admin, estacionamento_id)";
                query += "values('"+usuario.Nome+"', '"+usuario.Cpf+"', '"+usuario.Email+"', '"+usuario.Usuario+"', '"+usuario.Senha+"', "+admin+", (select top 1 estacionamento_id from estacionamento))";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                int ok = cmd.ExecuteNonQuery();

                sqlCon.Close();

                if (ok > 0) 
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);
                
                return false;
            }
        }

        public bool atualizaDetalhes(User usuario)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                int admin = 0;
                if (usuario.IsAdmin)
                {
                    admin = 1;
                }
                else
                {
                    admin = 0;
                }

                string query = "update funcionario set nome = '"+usuario.Nome+"', cpf = '"+usuario.Cpf+"', email = '"+usuario.Email+"', usuario = '"+usuario.Usuario+"', is_admin = "+admin;
                query += " where funcionario_id = " + usuario.Id;

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                int ok = cmd.ExecuteNonQuery();

                sqlCon.Close();

                if (ok > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return false;
            }
        }
    }
}
